package com.zty.service.impl;

import com.zty.component.SmsComponent;
import com.zty.config.SmsConfig;
import com.zty.constant.RedisKey;
import com.zty.enums.BizCodeEnum;
import com.zty.enums.SendCodeEnum;
import com.zty.service.NotifyService;
import com.zty.util.CheckUtil;
import com.zty.util.CommonUtil;
import com.zty.util.JsonData;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * @author ZTY
 * @describe
 * @time 2024-01-22 23:57
 * @projectName zty-short-url
 */
@Service
@Slf4j
public class NotifyServiceImpl implements NotifyService {

    private static final int CODE_EXPIRED = 1000 * 60 * 10;

    @Autowired
    private SmsComponent smsComponent;

    @Autowired
    private SmsConfig smsConfig;

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    public JsonData sendCode(SendCodeEnum userRegister, String to) {

        //  将此次请求的key生成（类型 + 手机号码/邮箱号）
        String cacheKey = String.format(RedisKey.CHECK_CODE_KEY,userRegister,to);
        String cacheValue = redisTemplate.opsForValue().get(cacheKey);

        //  如果此次key已存在，则判断是否60秒内重复请求发送验证码
        if (StringUtils.isNotBlank(cacheValue)){

            //  取出已缓存的时间戳
            long ttl = Long.parseLong(StringUtils.split(cacheValue, "_")[1]);

            //  生成当前时间戳
            long currentTimestamp = CommonUtil.getCurrentTimestamp();

            long leftTime = currentTimestamp - ttl;
            if (leftTime < 1000*60){
                //  打印日志
                log.info("两次发送时间间隔为：【{}】",leftTime);
                //  抛出验证码发送过快异常
                JsonData.buildResult(BizCodeEnum.CODE_LIMITED);
            }
        }

        //  如果此次key不存在，则将此次发送验证码存入redis
        //  生成短信验证码
        String randomCode = CommonUtil.getRandomCode(6);

        //  设置cacheValue（短信验证码 + "+" + 时间戳）
        String value = randomCode + "_" + CommonUtil.getCurrentTimestamp();

        //  存入redis
        redisTemplate.opsForValue().set(cacheKey,value,CODE_EXPIRED,TimeUnit.MILLISECONDS);

        if(CheckUtil.isEmail(to)){
            //邮箱验证码

        }else if(CheckUtil.isPhone(to)){
            //短信验证码
            smsComponent.send(to, smsConfig.getTemplateId(), randomCode);
        }
        return JsonData.buildSuccess();
    }



}
